package com.situation.controller;

import com.github.pagehelper.PageInfo;
import com.situation.annotation.ControllerEndpoint;
import com.situation.pojo.DO.BizProductCategory;
import com.situation.service.BizProductCategoryService;
import com.situation.util.RespUtil;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 物资分类controller层
 */
@RestController
@RequestMapping("/api/productCategory")
public class BizProductCategoryController {
    @Autowired
    private BizProductCategoryService bizProductCategoryService;

    /**
     * 添加分类
     * @param bizProductCategory 分类对象
     * @return 返回int类型 1为成功，0为失败
     */
    @ControllerEndpoint(exceptionMessage = "添加物资分类失败",operation = "添加物资分类")
    @PostMapping("/add")
    @RequiresPermissions({"productCategory:add"})
    public RespUtil add(BizProductCategory bizProductCategory){
        bizProductCategory.setCreateTime(LocalDateTime.now());
        bizProductCategory.setModifiedTime(LocalDateTime.now());
        int i = bizProductCategoryService.add(bizProductCategory);
        if (i==1){
            return RespUtil.ok();
        }else
            return RespUtil.fail();
    }

    /**
     * 查询全部分类树
     * @param pageNum 页码
     * @param pageSize 每页数据
     * @return 返回全部对象合集
     */
    @GetMapping("/categoryTree")
    public RespUtil categoryTree(int pageNum,int pageSize){
        PageInfo<BizProductCategory> parentCategoryTree = bizProductCategoryService.getcategoryTree(pageNum, pageSize);
        if (parentCategoryTree!=null){
            return RespUtil.ok().setData(parentCategoryTree);
        }else {
            return RespUtil.fail();
        }
    }

    /**
     * 删除分类
     * @param id 分类id
     * @return 返回int类型 1为成功，0为失败
     */
    @ControllerEndpoint(exceptionMessage = "删除物资分类失败",operation = "删除物资分类")
    @DeleteMapping("/delete/{id}")
    @RequiresPermissions({"productCategory:delete"})
    public RespUtil delete(@PathVariable("id")Long id){
        int i = bizProductCategoryService.delete(id);
        if (i==3){
            return RespUtil.fail().setData("删除失败，该分类存在子节点");
        }else if (i==2){
            return RespUtil.fail().setData("删除失败，该类下物品数不为零");
        } else if (i==1){
            return RespUtil.ok();
        }else
            return RespUtil.fail();
    }

    /**
     * 根据id查询分类对象
     * @param id 分类id
     * @return 返回分类对象
     */
    @GetMapping("/edit/{id}")
    @RequiresPermissions({"productCategory:edit"})
    public RespUtil selectById(@PathVariable("id")Long id){
        BizProductCategory bizProductCategory = bizProductCategoryService.selectById(id);
        if (bizProductCategory!=null){
            return RespUtil.ok().setData(bizProductCategory);
        }else {
            return RespUtil.fail();
        }
    }

    /**
     * 查询所有分类，应该用不上
     * @return 所有对象合集
     */
    @GetMapping("/findAll")
    public RespUtil findAll(){
        PageInfo<BizProductCategory> all = bizProductCategoryService.findAll();
        if (all!=null){
            return RespUtil.ok().setData(all);
        }else
            return RespUtil.fail();
    }

    /**
     * 多条件查询，可以为空，默认查询全部
     * @param bizProductCategory 分类对象
     * @param pageNum 页码
     * @param pageSize 每页数据个数
     * @return 符合条件对象合集
     */
    @GetMapping("/findProductCategoryList")
    public RespUtil findProductCategoryList(BizProductCategory bizProductCategory,int pageNum,int pageSize){
        PageInfo<BizProductCategory> bizProductCategoryList = bizProductCategoryService.findBizProductCategoryList(bizProductCategory,pageNum,pageSize);
        if (bizProductCategoryList!=null){
            return RespUtil.ok().setData(bizProductCategoryList);
        }else
            return RespUtil.fail();
    }

    /**
     * 查询全部父类树
     * @return 返回父对象合集
     */
    @GetMapping("/getParentCategoryTree")
    public RespUtil getParentCategoryTree(){
        List<BizProductCategory> parentCategoryTree = bizProductCategoryService.getParentCategoryTree();
        return RespUtil.ok().setData(parentCategoryTree);
    }

    /**
     * 根据pid进行分组
     * @param pid 父id
     * @return 返回分类对象的集合
     */
    @GetMapping("/findByPid/{id}")
    public RespUtil findByPid(@PathVariable("id")Long pid){
        List<BizProductCategory> bizProductCategories = bizProductCategoryService.groupById(pid);
        return RespUtil.ok().setData(bizProductCategories);
    }

    /**
     * 更新数据
     * @param bizProductCategory 分类对象
     * @return 返回int类型 1为成功，0为失败
     */
    @ControllerEndpoint(exceptionMessage = "更新物资分类失败",operation = "更新物资分类")
    @PutMapping("/update/{id}")
    @RequiresPermissions({"productCategory:update"})
    public RespUtil update(@PathVariable("id")Long id,BizProductCategory bizProductCategory){
        bizProductCategory.setModifiedTime(LocalDateTime.now());
        bizProductCategory.setId(id);
        int i = bizProductCategoryService.update(bizProductCategory);
        if (i==1){
            return RespUtil.ok();
        }else
            return RespUtil.fail();
    }
}
